﻿using System;
using System.IO;
using System.Collections.Specialized;
using System.Net;
using System.Text;

namespace NeroConnect.Network
{
	class HttpListenerRequest : IListenerRequest
	{
        private HttpListenerContext _context;
		private MiniHttpServer.IHttpRequest _listenerRequest;

        public HttpListenerRequest(HttpListenerContext context, MiniHttpServer.IHttpRequest httpListenerRequest)
		{
			if (httpListenerRequest == null)
				throw new ArgumentNullException("httpListenerRequest");
            _context = context;
			_listenerRequest = httpListenerRequest;
		}

        public void Dispose()
        {

        }

		public Uri Url
		{
			get { return _listenerRequest.Uri; }
		}

		public string RawUrl
		{
            get { return _listenerRequest.Uri.AbsoluteUri; }
		}

		public Stream InputStream
		{
			get { return _listenerRequest.GetBody(); }
		}

		public string HttpMethod
		{
			get { return _listenerRequest.Method; }
		}

		public NameValueCollection Headers
		{
			get {
                return _listenerRequest.Headers;
            }
		}

		public bool HasEntityBody
		{
			get { return _listenerRequest.GetBody() != null; }
		}

		public string ContentType
		{
			get { return _listenerRequest.ContentType; }
		}

		public long ContentLength64
		{
			get { return _listenerRequest.ContentLength; }
		}

		public Encoding ContentEncoding
		{
            get { return System.Text.Encoding.UTF8; }
		}

		public string UserAgent
		{
			get { 
                NameValueCollection headers = Headers;
                return headers["User-Agent"];
            }
		}

		public string UserHostAddress
		{
			get {
                throw new NotImplementedException();
            }
		}

		public string UserHostName
		{
			get {
                throw new NotImplementedException();
            }
		}

		public bool IsLocal
		{
            get
            {
                throw new NotImplementedException();
            }
        }

		public bool IsSecureConnection
		{
			get { 
                return false; 
            }
		}

		public bool KeepAlive
		{
			get { 
                return true; 
            }
		}

		public IPEndPoint RemoteEndPoint
		{
            get
            {
                throw new NotImplementedException();
            }
        }

		public IPEndPoint LocalEndPoint
		{
            get
            {
                throw new NotImplementedException();
            }
        }
	}
    //class HttpListenerRequest : IListenerRequest
    //{
    //    private System.Net.HttpListenerRequest _listenerRequest;

    //    public HttpListenerRequest(System.Net.HttpListenerRequest httpListenerRequest)
    //    {
    //        if (httpListenerRequest == null)
    //            throw new ArgumentNullException("httpListenerRequest");
    //        _listenerRequest = httpListenerRequest;
    //    }

    //    public Uri Url
    //    {
    //        get { return _listenerRequest.Url; }
    //    }

    //    public string RawUrl
    //    {
    //        get { return _listenerRequest.RawUrl; }
    //    }

    //    public Stream InputStream
    //    {
    //        get { return _listenerRequest.InputStream; }
    //    }

    //    public string HttpMethod
    //    {
    //        get { return _listenerRequest.HttpMethod; }
    //    }

    //    public NameValueCollection Headers
    //    {
    //        get { return _listenerRequest.Headers; }
    //    }

    //    public bool HasEntityBody
    //    {
    //        get { return _listenerRequest.HasEntityBody; }
    //    }

    //    public string ContentType
    //    {
    //        get { return _listenerRequest.ContentType; }
    //    }

    //    public long ContentLength64
    //    {
    //        get { return _listenerRequest.ContentLength64; }
    //    }

    //    public Encoding ContentEncoding
    //    {
    //        get { return _listenerRequest.ContentEncoding; }
    //    }

    //    public string UserAgent
    //    {
    //        get { return _listenerRequest.UserAgent; }
    //    }

    //    public string UserHostAddress
    //    {
    //        get { return _listenerRequest.UserHostAddress; }
    //    }

    //    public string UserHostName
    //    {
    //        get { return _listenerRequest.UserHostName; }
    //    }

    //    public bool IsLocal
    //    {
    //        get { return _listenerRequest.IsLocal; }
    //    }

    //    public bool IsSecureConnection
    //    {
    //        get { return _listenerRequest.IsSecureConnection; }
    //    }

    //    public bool KeepAlive
    //    {
    //        get { return _listenerRequest.KeepAlive; }
    //    }

    //    public IPEndPoint RemoteEndPoint
    //    {
    //        get { return _listenerRequest.RemoteEndPoint; }
    //    }

    //    public IPEndPoint LocalEndPoint
    //    {
    //        get { return _listenerRequest.LocalEndPoint; }
    //    }
    //}
}
